﻿import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { message } from 'antd';
import {history} from "@@/core/history";
import {stringify} from "querystring";
import {outLogin} from "@/services/wms-dev-tool/login";

// 错误处理方案： 错误类型
enum ErrorShowType {
  SILENT = 0,
  WARN_MESSAGE = 1,
  ERROR_MESSAGE = 2,
  NOTIFICATION = 3,
  REDIRECT = 9,
}
// 与后端约定的响应数据格式
interface ResponseStructure {
  success: boolean;
  data: any;
  errorCode?: number;
  errorMessage?: string;
  showType?: ErrorShowType;
}


async function handleErrorResponse(error: any) {
  console.log("error response-------------->", error.response)
  const {data} = error.response;
  if (data.code === 401 || data.message === 'Token失效，请重新登录') {
    // await outLogin()
    message.error(data.message)
    const {search, pathname} = window.location;
    const urlParams = new URL(window.location.href).searchParams;
    /** 此方法会跳转到 redirect 参数所在的位置 */
    const redirect = urlParams.get('redirect');
    if (window.location.pathname !== '/user/login' && !redirect) {
      history.replace({
        pathname: '/user/login',
        search: stringify({
          redirect: pathname + search,
        }),
      });
    }
  } else if (data.code === 500 || data.status === 500) {
    console.log("code = 500--------------->")
    message.error(error.message)
  }
}

/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const errorConfig: RequestConfig = {
  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误接收及处理
    errorHandler: async (error: any, opts: any) => {
      console.log("进入errorHandler-------------------->", error,error.response)
      if (opts?.skipErrorHandler) throw error;
      if (error.response) {
        // Axios 的错误
        // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
        await handleErrorResponse(error);
        // message.error(`Response status:${error.response.status}`);
      } else if (error.request) {
        // 请求已经成功发起，但没有收到响应
        // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
        // 而在node.js中是 http.ClientRequest 的实例
        message.error('None response! Please retry.');
      } else {
        // 发送请求时出了点问题
        message.error(error.message)
        // message.error('Request error, please retry.');
      }
    },
  },

  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      // 拦截请求配置，进行个性化处理。
      console.log("请求拦截器----------------------")
      const url = config?.url
      const token = localStorage.getItem('token')
      const userInfoStr = localStorage.getItem("userInfo")
      if(userInfoStr && userInfoStr !== 'undefined'){
        const userInfo = JSON.parse(userInfoStr||"")
        const authHeader = {
          'X-Access-Token': token,
          'X-Tenant-Id':userInfo?.userInfo?.loginTenantId,
          ...config.headers
        };
        return { ...config, url,headers: authHeader };
      }
      return { ...config, url};
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response) => {
      // 拦截响应数据，进行个性化处理
      const { data } = response as unknown as ResponseStructure;
      console.log("响应拦截器-------------------------")
      if (data?.success === false) {
        console.log("请求失败",response)
        data.data = {}
        // message.error(data.message||data.msg)
        let err = new Error();
        err.message = data.msg||data.message
        throw err;
      }
      data.data = data.data || {}
      return response;
    },
  ],
};
